function obterAtributos(aCasoPai) {
  var params = new Hash();
  
  if (isNaN(aCasoPai)) {
    params.set("auto",aCasoPai);
  } else {
    params.set("cp",aCasoPai);
  }

  if (Prototype.Browser.IE) {
    params.set("cachebuster",new Date().getTime());
  }
  
  new Ajax.Request("statuspooling.php"
                  ,{ method: "get"
                   , onCreate: function (xhrObject,jsonResponseHeader) { $("ajaxStatus").update("<img src=\"img/ajax-loader.gif\">"); $("ajaxStatus2").update("Obtendo dados atualizados..."); } 
                   , onSuccess: function(xhrObject,jsonResponseHeader) {
                                  $("ajaxStatus").update("<img src=\"img/ajax-loader-gui.gif\">");
                                  $("ajaxStatus2").update("Atualizando Post-Its...");
                                  var JSON = xhrObject.responseText.evalJSON();
                                  adicionarPostItsFaltantes(JSON.postIts,0);
                                  removerPostItsSobrantes($$("div.minipostit"),JSON.postIts,0);
                                  atualizarEstatisticas(JSON);
                                  atualizarPostIts(JSON.postIts,0,aCasoPai);
                                }
                   , parameters: params
                   }
                  );
}

function debugMessage(aID,aMessage) {
  $(aID).update(aMessage);
}

function setParent(aElementID,aParentID) {
  $(aParentID).insert({bottom: $(aElementID).remove()})
}

function atualizarEstatisticas(aJSON) {
  var cf = $("casosFilhos");
  var pt = $("pesoTotal");
  var pm = $("pesoMedio");
  var os = $("offSprints");
  var pb = $("productBacklog");
  
  if (aJSON.cf != cf.innerHTML) {
    cf.update(aJSON.cf);
    cf.up().highlight({startcolor: "#00FF00"});
  }
    
  if (aJSON.pt != pt.innerHTML) {
    pt.update(aJSON.pt.replace(".",","));
    pt.up().highlight({startcolor: "#00FF00"});
  }

  if (aJSON.pm != pm.innerHTML) {
    pm.update(aJSON.pm.replace(".",","));
    pm.up().highlight({startcolor: "#00FF00"});
  }

  if (aJSON.os != os.innerHTML) {
    os.update(aJSON.os);
    os.up().highlight({startcolor: "#00FF00"});
  }
  
  if (aJSON.pb != pb.innerHTML) {
    pb.update(aJSON.pb);
    pb.up().highlight({startcolor: "#00FF00"});
  }
} 

function criarPostIt(aInfo) {
  var PIT = new Template(
"<div class=\"#{classe}\" id=\"c#{numerocaso}\" style=\"display: none\">\
  <div id=\"ac#{numerocaso}\" style=\"display: none\">#{infojson}</div>\
  <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"miniPostit\">\
    <tr><td class=\"miniNomeSistema\">#{nomesistema}</td></tr>\
    <tr><td class=\"miniNumeroCaso\"><a href=\"#{rootmantis}/view.php?id=#{numerocaso}\" style=\"text-decoration: none;\" target=\"_new\">#{numerocaso}</a></td></tr>\
    <tr><td class=\"miniPontuacao\">#{pontuacao} SP</td></tr>\
  </table>\
</div>");
  
  switch (parseInt(aInfo.completude)) {
    case 50: var tipo = 2;
    break;
    case 75: var tipo = 3;
    break;
    case 100: var tipo = 4;
    break;
    default: var tipo = 1;
  }
  
  if (aInfo.offsprint) {
    var prioridade = " off";    
  } else {
    switch (aInfo.prioridade) {
      case 20: var prioridade = " p1";
      break;
      case 30: var prioridade = " p2";
      break;
      case 40: var prioridade = " p3";
      break;
      case 50: var prioridade = " p4";
      break;
      default: var prioridade = "";
    }
  }

  var PIR = { classe: "minipostit" + prioridade, nomesistema: aInfo.sistema, infojson: Object.toJSON(aInfo), numerocaso: aInfo.caso, versao: aInfo.versao, pontuacao: aInfo.storypoints, rootmantis: rootMantis };
  
  $$("table.quadroscrum")[0].insert({before: PIT.evaluate(PIR)});
  
  PIT = new Template(
"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"postit\">\
  <tr><td colspan=\"2\" class=\"nomeSistema\">#{nomesistema}</td></tr>\
  <tr><td colspan=\"2\" class=\"numeroCaso\">#{numerocaso}</td></tr>\
  <tr><td colspan=\"2\">#{percentual}</td></tr>\
  <tr><td class=\"versao\">v#{versao}</td><td class=\"pontuacao\">#{pontuacao} SP</td></tr>\
</table>");
  
  PIR = { nomesistema: aInfo.sistema, numerocaso: aInfo.caso, versao: aInfo.versao, pontuacao:aInfo.storypoints, percentual: display2("completude_c" + aInfo.caso,aInfo.completude,tipo) };
  new Tip("c" + aInfo.caso, PIT.evaluate(PIR), {style: "postitamarelo"});
}

function adicionarPostItsFaltantes(aPostIts,aIndex) {
  if (aIndex < aPostIts.length) {
    
    if(!$("c" + aPostIts[aIndex].caso)) {
      criarPostIt(aPostIts[aIndex]);
    }
    
    adicionarPostItsFaltantes(aPostIts,aIndex + 1);
  } 
}

function removerPostItsSobrantes(aPostItsNaTela,aPostIts,aIndex) {
  if (aIndex < aPostItsNaTela.length) {
    var i;
    
    for (i = 0; i < aPostIts.length; i++) {
      if (aPostItsNaTela[aIndex].id == "c" + aPostIts[i].caso) {
        break;
      }
    }
    
    if (i == aPostIts.length) {
      $(aPostItsNaTela[aIndex].id).title = "d";
    }
    
    removerPostItsSobrantes(aPostItsNaTela,aPostIts,aIndex + 1);
  } else {
    executarOcultacaoDePostIts($$("div[title=d]"),0);
  }
}

function executarOcultacaoDePostIts(aPostItsARemover,aIndex) {
  if (aPostItsARemover.length > 0) {
    if (aIndex < aPostItsARemover.length) {
      aPostItsARemover[aIndex].shrink({ duration: 0.3, afterFinish: function(effect) { executarOcultacaoDePostIts(aPostItsARemover,aIndex + 1); }});
    } else {
      executarRemocaoDePostits(aPostItsARemover);
    }
  }
}

function executarRemocaoDePostits(aPostItsARemover) {
  for (var i = 0; i < aPostItsARemover.length; i++) {
    aPostItsARemover[i].remove();  
  }  
};

function atualizarPostIts(aPostIts,aIndex,aCasoPai) {
  if (aIndex < aPostIts.length) {
    var alterou     = false;
    var caso        = aPostIts[aIndex].caso;
    var status      = aPostIts[aIndex].status;
    var versao      = aPostIts[aIndex].versao;
    var storypoints = aPostIts[aIndex].storypoints;
    var completude  = aPostIts[aIndex].completude;
    var offsprint   = aPostIts[aIndex].offsprint;
    var prioridade  = aPostIts[aIndex].prioridade;
    
    var paiAtual        = $("c" + caso).up();
    var atributosAtuais = $("ac" + caso).innerHTML.evalJSON();
    
    if (atributosAtuais.storypoints != storypoints) {
      alterou = true;

      /* Atualiza a variável de controle */
      atributosAtuais.storypoints = storypoints;
      
      /* Atualiza o Mini Postit */
      $("c" + caso).down("td.miniPontuacao").innerHTML = storypoints + " SP";
      
      /* Executa o feedback visual */
      $("c" + caso).pulsate({ queue: "end" });
    }
    
    if (atributosAtuais.versao != versao) {
      alterou = true;
      atributosAtuais.versao = versao;
      $("c" + caso).pulsate({ queue: "end" });
    }
    
    if (atributosAtuais.completude != completude) {
      alterou = true;
      atributosAtuais.completude = completude;
      $("c" + caso).pulsate({ queue: "end" });
    }

    if (atributosAtuais.offsprint != offsprint) {
      alterou = true;
      atributosAtuais.offsprint = offsprint;
      $("c" + caso).pulsate({ queue: "end" });
    }
    
    if (atributosAtuais.prioridade != prioridade) {
      alterou = true;
      atributosAtuais.prioridade = prioridade;
     
      $("c" + caso).pulsate({ queue: "end" });
    }

    if (alterou) {
      /* Atualiza o Postit no Prototip. Chamar New Tip automaticamente remove o Prototip existente no ID indicado */
      $("ac" + caso).innerHTML = Object.toJSON(atributosAtuais);

      switch (parseInt(completude)) {
        case 50: var tipo = 2;
        break;
        case 75: var tipo = 3;
        break;
        case 100: var tipo = 4;
        break;
        default: var tipo = 1;
      }
      
      postitReplace = { nomesistema: $("c" + caso).down("td.miniNomeSistema").innerHTML, numerocaso: caso, versao: versao, pontuacao: storypoints, percentual: display2("completude_c" + caso,completude,tipo) };
      new Tip("c" + caso, postitTemplate.evaluate(postitReplace), {style: "postitamarelo"});

      /* Remove todos os atributos adicionais */
      $("c" + caso).removeClassName("off");
      $("c" + caso).removeClassName("p4");
      $("c" + caso).removeClassName("p3");
      $("c" + caso).removeClassName("p2");
      $("c" + caso).removeClassName("p1");
      
      if (offsprint) {
        $("c" + caso).addClassName("off");    
      } else {
        switch (prioridade) {
          case 20: $("c" + caso).addClassName("p1");
          break;
          case 30: $("c" + caso).addClassName("p2");
          break;
          case 40: $("c" + caso).addClassName("p3");
          break;
          case 50: $("c" + caso).addClassName("p4");
          break;
        }
      }
      
/*
      if (offsprint) {
        $("c" + caso).addClassName("off");
      } else {
        $("c" + caso).removeClassName("off");
      }
      
*/
    }
    
    if (paiAtual.id == "scruMantis") {
      setParent("c" + caso,status);
      $("c" + caso).blindDown({ duration: 0.2, afterFinish: function(effect) { atualizarPostIts(aPostIts,aIndex + 1,aCasoPai); }});
    } else if (paiAtual.id != status) {
      $("c" + caso).blindUp({ duration: 0.2, queue: "end", afterFinish: function(effect) { setParent("c" + caso,status); }});
      $("c" + caso).blindDown({ duration: 0.2, queue: "end", afterFinish: function(effect) { atualizarPostIts(aPostIts,aIndex + 1,aCasoPai); }});
    } else {
      atualizarPostIts(aPostIts,aIndex + 1,aCasoPai);  
    }
  } else {
    $("ajaxStatus").title = new Date().getTime() + ajaxTimeOut;
    temporizador(aCasoPai);  
  }
}

function temporizador(aCasoPai) {  
  var timeOut = parseInt($("ajaxStatus").title);
  var agora = new Date().getTime();
  
  if (timeOut > agora) {
    var diferenca = new Date(timeOut - agora);
    
    $("ajaxStatus").update("Próxima checagem em: <b>" + diferenca.getMinutes().toPaddedString(2) + ":" + diferenca.getSeconds().toPaddedString(2) + "</b>");
    $("ajaxStatus2").update();
    
    if (isNaN(aCasoPai)) {
      setTimeout("temporizador(\"" + aCasoPai + "\")",1000);  
    } else {
      setTimeout("temporizador(" + aCasoPai + ")",1000);  
    }
  } else {
    obterAtributos(aCasoPai);
  }
}

function inicializarPooling(aCasoPai) {
  obterAtributos(aCasoPai);
}

function alteranrInfoCasoPai (aImg) {
  if ($("casoPaiLinha4").visible()) {
    $("casoPaiLinha4").hide();
    $("casoPaiLinha3").hide();
    $("casoPaiLinha2").hide();
    $("casoPaiLinha1").hide();
    aImg.src = "img/plus.png";
  } else {
    $("casoPaiLinha1").show();
    $("casoPaiLinha2").show();
    $("casoPaiLinha3").show();
    $("casoPaiLinha4").show();
    aImg.src = "img/minus.png";
  }
}